package TokensDelLenguaje;

import Parser.ParserTokens;


public class Token implements Cloneable {
    
  protected Tokens id; // Identificador del token
  private int linea; // Nº de linea del fuente donde aparece el token, 
  // se usa en la generación de código
  protected boolean salto = false; 
  
  public Token() {
    id = Tokens.ilegal;
    linea = -1;    
    salto = false;
  }
  
  public Token(Tokens id) {
    setId(id);
    salto = false;
  }
  
  public Tokens getId() {
    return id;
  }
  
  public void setId(Tokens id) {
    this.id = id;
  }
  
  public String getCadena() {
    return this.toString();
  }
  
  public void setCadena(String s) {
  }
  
  public Long getLong(){
      return null;
  }
  
  public void setLong(Long l){

  }
  
  public Double getDouble() {
    return null;
  }
  
  public void setDouble(Double d) {

  }
  
  public boolean getSalto(){
      return this.salto;
  }
  
  public void setSalto(boolean salto){
      this.salto = salto;
  }
  
  public String getNombre(){
      return null;
  }
  
  public boolean esRegistro(){
      return false;
  }
  
  public short traducir() {
    switch(id){
      case var:
        return ParserTokens.IDENTIFICADOR;
      case identificador:
        return ParserTokens.IDENTIFICADOR;
      case struct:
        return ParserTokens.IDENTIFICADOR;
      case const_ulongint:
        return ParserTokens.CONST_UL;
      case const_uinteger:
        return ParserTokens.CONST_UI;
      case rsv_if:
        return ParserTokens.IF;
      case rsv_then:
        return ParserTokens.THEN;
      case rsv_else:
        return ParserTokens.ELSE;
      case rsv_for:
        return ParserTokens.FOR;
      case rsv_print:
        return ParserTokens.PRINT;
      case rsv_ulongint:
        return ParserTokens.ULONGINT;
      case rsv_uinteger:
        return ParserTokens.UINTEGER;
      case suma:
        return '+';
      case rsv_begin:
        return ParserTokens.BEGIN;
      case rsv_end:
        return ParserTokens.END;
      case rsv_struct:
        return ParserTokens.STRUCT;
      case resta:
        return '-';
      case asterisco:
        return '*';
      case division:
        return '/';
      case asignacion:
        return ParserTokens.ASIG;
      case mayor:
        return '>';
      case mayor_igual:
        return ParserTokens.MAYOR_IGUAL;
      case menor:
        return '<';
      case menor_igual:
        return ParserTokens.MENOR_IGUAL;
      case igual:
        return '=';
      case distinto:
        return ParserTokens.DIFERENTE;
      case llave_abre:
        return '{';
      case parentesis_abre:
        return '(';
      case llave_cierra:
        return '}';
      case parentesis_cierra:
        return ')';
      case coma:
        return ',';
      case punto_y_coma:
        return ';';
      case punto:
        return '.';
      case cadena:
        return ParserTokens.CADENA;
      case eof:
        return -1;
    }
    return -1;
  }
  
  @Override
  public boolean equals(Object o) {
    if(this.getClass() == o.getClass()) {
      if(id == ((Token)o).id) {
        return true;
      }
    }
    return false;
  }
  
  @Override
  public String toString() {
    switch(id){
      case ilegal:
        return "Token no Conocido";
      case var:
        return "Identificador";
      case identificador:
        return "Identificador";
      case struct:
        return "Identificador Estructura";
      case const_ulongint:
        return "Constante ULONGINT";
      case const_uinteger:
        return "Constante UINTEGER";
      case rsv_if:
        return "Palabra reservada: IF";
          case rsv_then:
        return "Palabra reservada: THEN";
      case rsv_else:
        return "Palabra reservada: ELSE";
      case rsv_for:
        return "Palabra reservada: FOR";
      case rsv_print:
        return "Palabra reservada: PRINT";
      case rsv_struct:
        return "Palabra reservada: STRUCT";
      case rsv_begin:
        return "Palabra reservada: BEGIN";
      case rsv_end:
        return "Palabra reservada: END";
      case rsv_ulongint:
        return "Palabra reservada: ULONGINT";
      case rsv_uinteger:
        return "Palabra reservada: UINTEGER";
      case suma:
        return "Operador aritmético: +";
      case resta:
        return "Operador aritmético: -";
      case asterisco:
        return "Operador aritmético: *";
      case division:
        return "Operador aritmético: /";
      case asignacion:
        return "Operador de asignación: :=";
      case mayor:
        return "[ Operador relacional: > ]";
      case mayor_igual:
        return "[ Operador relacional: >= ]";
      case menor:
        return "[ Operador relacional: < ]";
      case menor_igual:
        return "[ Operador relacional: <= ]";
      case igual:
        return "[ Operador relacional: == ]";
      case distinto:
        return "[ Operador relacional: != ]";
      case llave_abre:
        return "Apertura de llave: {";
      case parentesis_abre:
        return "Apertura de paréntesis: (";
      case llave_cierra:
        return "Cierre de llave: }";
      case parentesis_cierra:
        return "Cierre de paréntesis: )";
      case coma:
        return "Coma: ,";
      case punto:
        return "Operador de Estructura Punto: .";
      case punto_y_coma:
        return "Punto y coma: ;";
      case cadena:
        return "Cadena de caracteres";
      case eof:
        return "Fin de archivo";
      case salto_incondicional:
        return "[ BI ]";
      case cmp:
        return "CMP";
    }
    return " ERROR - ***No existe el token*** ";
  }
  
    @Override
  public Object clone(){
        Token clone = null;
        try {
            
            clone = (Token)super.clone();
            clone.setId(this.getId());
            
        } catch (CloneNotSupportedException ex) {
            System.out.println(" no se puede duplicar");
        }
        return clone;
  }
    
  public String traducir_assembler(){
      return "";
  }

  public void setPadre(Token_Identificador token_Identificador) {
   }

    public void setLinea(int linea) {
        this.linea = linea;
    }
    
    public int getLinea(){
        return linea;
    }

}
